<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="../css/reset.css">
    <style>
        .title {
            line-height: 40px;
        }

        .list {
            padding: 20px 0;
            margin-top: 20px;
            background-color: grey;
            overflow: hidden;
        }

        .list li {
            height: 32px;
            line-height: 32px;
            border: 1px dashed #333;
            background-color: pink;
            margin-top: 10px;
        }

        .list li+li {
            margin-top: 10px;
        }

        span,
        p {
            display: block;
            height: 32px;
            line-height: 32px;
            border: 1px dashed #333;
            background-color: #6ff;
            margin-top: 10px;
        }
    </style>
</head>

<body>
    <div id="wrap">
        <button class="add">新增</button>
        <button class="del">删除</button>
        <ul class="list one">
            <li id="first">01</li>
            <li class="second">02</li>
            <li class="third mid">03</li>
            <li>04</li>
            <li>05</li>
            <li data-msg="last">06</li>
        </ul>
    </div>
</body>
<script>
    // 事件委托:  利用事件冒泡的元素,将子元素的事件,委托给父(代)元素,由父元素代为执行

    // 分析
    // lix6 => 先触发自己的 => 冒泡 .list -> #wrap -> body -> html -> document -> window


    // 事件委托的实现步骤:
    // 1. 给父元素绑定相同类型的事件
    // 2. 找到触发事件的元素(给父元素绑定事件 -> 除了它本身以外,子代元素也可触发)
    // 3. 判断触发事件的元素 => 是否是委托事件的子代元素
    //    a. 如果元素的类型不同,通过tagName进行区分
    //    b. 如果元素类型相同, => 通过元素的属性进行区分



    // 为什么新增的li也可以触发事件?
    // 因为现在已经将事件委托给 list, 无论是原有的li还是新增的li,点击他们都会冒泡到list(list中已经提前指定了要执行的内容)   => 可以给未来生成的元素绑定事件(间接绑定)

    // 为什么新增的li下标也是对的?
    // list.getElementsByTagName()  获取的元素,会随页面同类型元素的增加而自动更新集合

    // 事件委托的优点:
    // 1. 事件只用绑定给委托的父元素一个即可 => 节省内存,提高了代码的执行效率
    // 2. 可以给未来生成的元素绑定事件
    // 3. 代码结构更加清晰,方便后期维护


    var list = document.getElementsByClassName("list")[0];
    var liList = list.getElementsByTagName("li");

    list.onclick = function (e) {
        var e = e || window.event;
        var target = e.target;
        // console.log("list被点击", target);

        // this -> 绑定事件的元素(list)
        if (target === this) {
            console.log("点击了list");
        } else if (target.tagName.toLowerCase() === "li") {

            // 对点击的li进行区分 => 执行不同的内容

            // 打印被点击的li和下标
            var index = Array.from(liList).indexOf(target)

            if (target.id == "first") {
                console.log("点击了第一个li", index);
            } else if (target.className == "second") {
                console.log("点击了第二个li", index);
            } else if (target.classList.contains("third")) {
                console.log("点击了第三个li", index);
            } else if (target.dataset.msg == "last") {
                console.log("点击了最后一个li", index);
            } else if (target.className == "newLi") {
                console.log("点击了新增的li", index);
            } else {
                console.log("点击了其他的li", index);
            }


        }

    }

    var add = document.querySelector(".add");
    var del = document.querySelector(".del");

    add.onclick = function () {
        // 创建元素节点
        var li = document.createElement("li");
        li.innerText = "我是新增的li";
        li.className = "newLi";
        li.style.backgroundColor = "red";
        list.append(li);

        console.log("liList", liList);
    }

    del.onclick = function () {
        var last = list.lastElementChild;
        last.remove();

        console.log("liList", liList);
    }


</script>

</html>